BOJ 2166 다각형의 면적 문제 풀이 추가 #26
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
BOJ 2166 다각형의 면적 문제를 신발끈 공식(Shoelace Formula)을 활용한 계산 기하학 알고리즘으로 해결하고, 문제 분석부터 알고리즘 선택, 구현까지의 전체 사고 과정을 문서화했습니다. 특히 선형대수를 모르는 사람도 이해하기 쉽게 설명하는 것을 목표로, 기하학적 직관을 중심으로 신발끈 공식을 설명했습니다.
주요 구현 내용:
추가된 파일:
computational-geometry/boj-2166/1.analysis.md: 문제 분석 및 핵심 제약 조건 (120줄)computational-geometry/boj-2166/2.algorithm.md: 신발끈 공식 알고리즘 및 면적 계산 방법 (346줄)computational-geometry/boj-2166/3.reasoning.md: 알고리즘 선택 근거 및 코드 설계 (180줄)computational-geometry/boj-2166/Main.java: 신발끈 공식 기반 해답 코드 (53줄)주요 판단 및 구현 세부사항
1. 신발끈 공식을 활용한 면적 계산: 왜 삼각형 분할이나 다른 방법이 아닌가?
배경 및 문제 상황:
다각형의 면적을 구하는 문제에서, 직관적으로는 다각형을 여러 개의 삼각형으로 나누어 각각의 넓이를 더하는 방법을 생각할 수 있습니다. 하지만 이러한 방법은 삼각형으로 나누는 로직이 복잡하고, 구현이 어려울 수 있습니다.
해결 방안:
신발끈 공식(Shoelace Formula)을 활용하여 각 변에 대해 간단한 계산만으로 면적을 구합니다.
핵심 사고 과정:
x[i] * y[j] - x[j] * y[i]계산구현 코드:
다른 접근 방식과의 비교:
1. 삼각형으로 분할:
// 다각형을 여러 삼각형으로 나누어 각각의 넓이를 더함2. 사다리꼴로 분할:
// 각 변과 원점을 연결한 사다리꼴의 넓이를 계산3. 신발끈 공식 (현재 방식) ✅:
고민한 점:
2. 선형대수 지식 없이 이해하기 쉽게 설명: 기하학적 직관 중심
배경 및 문제 상황:
신발끈 공식은 외적(Cross Product)을 기반으로 하지만, 선형대수를 모르는 사람에게는 이해하기 어려울 수 있습니다. 외적이나 행렬식 같은 개념을 최소화하고, 기하학적 직관을 중심으로 설명해야 합니다.
해결 방안:
"사다리꼴 넓이의 합"이라는 기하학적 직관을 중심으로 설명하고, 외적 개념은 선택적으로 설명합니다.
핵심 설명 방식:
문서 구조:
고민한 점:
3. 오버플로우 방지: 왜 long 타입을 사용하는가?
배경 및 문제 상황:
좌표 범위가 -100,000 ~ 100,000이므로, 신발끈 공식 계산 시 최대값은 100,000 × 100,000 = 10,000,000,000입니다. int 범위는 -2,147,483,648 ~ 2,147,483,647이므로 오버플로우가 발생합니다.
해결 방안:
long 타입을 사용하여 오버플로우를 방지합니다.
구체적인 계산:
구현 코드:
고민한 점:
4. 절댓값 사용: 왜 절댓값을 사용하는가?
배경 및 문제 상황:
신발끈 공식의 결과는 다각형이 시계 방향이면 음수, 반시계 방향이면 양수가 나옵니다. 하지만 면적은 항상 양수여야 합니다.
해결 방안:
절댓값을 구한 후 2로 나눕니다.
구체적인 예시:
구현 코드:
고민한 점:
5. 마지막 점과 첫 번째 점 연결: 순환 구조 처리
배경 및 문제 상황:
다각형은 닫힌 도형이므로, 마지막 점 P[N-1]과 첫 번째 점 P[0]도 연결되어야 합니다.
해결 방안:
모듈로 연산을 사용하여 순환 구조를 만듭니다.
구현 코드:
예시:
고민한 점:
(i + 1) % n을 사용하여 간단하게 처리했습니다.구현 세부사항
1. 신발끈 공식 구현
핵심 로직:
x[i] * y[j] - x[j] * y[i]계산관련 코드:
예시 (정사각형: (0,0), (0,10), (10,10), (10,0)):
2. 시간 복잡도 분석
전체 시간 복잡도:
O(N)근거:
실제 연산 횟수:
3. 공간 복잡도 분석
전체 공간 복잡도:
O(N)근거:
실제 메모리 사용량:
메모리 제한과의 비교:
4. 반올림 처리
문제 요구사항:
해결 방안:
printf("%.1f", ...)를 사용하여 자동으로 반올림 처리합니다.구현 코드: